package com.pur.zsms.common.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

import com.pur.zsms.common.util.pub.FDate;

public class PubFun {

	public PubFun() {
	}

	/**
	 * 比较两个日期的大小
	 * 
	 * @param if StartDate>EndDate,return fasle else return true
	 * @param compareDate
	 * @return
	 */
	public static boolean checkDateAndEqualFalse(String StartDate, String EndDate) {
		String flag = "";
		FDate tFDate = new FDate();
		Date tStateDate = tFDate.getDate(StartDate);
		Date tEndDate = tFDate.getDate(EndDate);

		if (tStateDate.after(tEndDate)) {
			flag = "0";
			// logger.debug("开始日期晚于结束日期！！！！");

			return false;
		} else if (tStateDate.before(tEndDate)) {
			flag = "1";
			// logger.debug("开始日期早于结束日期！！！");

			return true;
		} else {
			// 相等
			return false;
		}
	}

	/**
	 * 比较两个日期的大小
	 * 
	 * @param if StartDate>EndDate,return fasle else return true
	 * @param compareDate
	 * @return
	 */
	public static boolean checkDateAndEqualTrue(String StartDate, String EndDate) {
		String flag = "";
		FDate tFDate = new FDate();
		Date tStateDate = tFDate.getDate(StartDate);
		Date tEndDate = tFDate.getDate(EndDate);

		if (tStateDate.after(tEndDate)) {
			flag = "0";
			// logger.debug("开始日期晚于结束日期！！！！");

			return false;
		} else if (tStateDate.before(tEndDate)) {
			flag = "1";
			// logger.debug("开始日期早于结束日期！！！");

			return true;
		} else {
			// 相等
			return true;
		}
	}

	/**
	 * 比较两个具体日期+具体时间的大小,YY-MM-DD HH-
	 * 
	 * @param date1
	 * @param date2
	 * @if date1<date2 return true
	 * @else return false author zz
	 */
	public static boolean isDateBefore(String date1, String date2) throws java.text.ParseException {

		String pattern = "hh:mm:ss";
		DateFormat df = new SimpleDateFormat(pattern);
		// DateFormat df = DateFormat.getDateTimeInstance();
		// DateFormat df = DateFormat.getTimeInstance();
		// 如果只是时间的比较，这里应该是DateFormat.getTimeInstance();
		// 只是日期的比较则是getDateInstance();

		Date dt1 = df.parse(date1.toString());
		Date dt2 = df.parse(date2.toString());
		if (dt1.getTime() >= dt2.getTime()) {
			return false;
		}else{
			return true;
		}
	}

	/**
	 * /** 身份证转换函数(15位转换为18位)
	 * <p>
	 * <b>Example: </b>
	 * <p>
	 * <p>
	 * SecurNum("412722851105") returns "412722198511051012"
	 * <p>
	 * 
	 * @param tStr
	 *            源字符串
	 * @return 字符串
	 */
	public static String TransID(String tStrID) {

		String tStrIDtmp = "";
		String tStrIDnew = "";
		String tChkLetter = "10X98765432";
		int j, k, a, w, r1 = 0;
		int w1 = 1;
		tStrIDtmp = tStrID.substring(0, 6) + "19" + tStrID.substring(6, 15);
		for (int i = 17; i >= 1; i--) {
			a = Integer.parseInt(tStrIDtmp.substring(i - 1, i));
			w1 = 2 * w1;
			w = w1 % 11;
			r1 = r1 + w * a;
		}
		j = r1 % 11;
		if (j >= 0 && j <= 10) {
			j = j + 1;
			tStrIDnew = tStrIDtmp + tChkLetter.substring(j - 1, j);
		} else {
			tStrIDnew = tStrIDtmp + "E";
		}
		return tStrIDnew;
	}

	/**
	 * 将字符串补数,将sourString的<br>
	 * 后面</br>用cChar补足cLen长度的字符串,如果字符串超长，则不做处理
	 * <p>
	 * <b>Example: </b>
	 * <p>
	 * <p>
	 * RCh("Minim", "0", 10) returns "Minim00000"
	 * <p>
	 * 
	 * @param sourString
	 *            源字符串
	 * @param cChar
	 *            补数用的字符
	 * @param cLen
	 *            字符串的目标长度
	 * @return 字符串
	 */
	public static String RCh(String sourString, String cChar, int cLen) {
		int tLen = sourString.length();
		int i, iMax;
		String tReturn = "";
		if (tLen >= cLen) {
			return sourString;
		}
		iMax = cLen - tLen;
		for (i = 0; i < iMax; i++) {
			tReturn += cChar;
		}
		tReturn = sourString.trim() + tReturn.trim();
		return tReturn;
	}

	/**
	 * 将字符串补数,将sourString的<br>
	 * 前面</br>用cChar补足cLen长度的字符串,如果字符串超长，则不做处理
	 * <p>
	 * <b>Example: </b>
	 * <p>
	 * <p>
	 * LCh("Minim", "0", 10) returns "00000Minim"
	 * <p>
	 * 
	 * @param sourString
	 *            源字符串
	 * @param cChar
	 *            补数用的字符
	 * @param cLen
	 *            字符串的目标长度
	 * @return 字符串
	 */
	public static String LCh(String sourString, String cChar, int cLen) {
		int tLen = sourString.length();
		int i, iMax;
		String tReturn = "";
		if (tLen >= cLen) {
			return sourString;
		}
		iMax = cLen - tLen;
		for (i = 0; i < iMax; i++) {
			tReturn += cChar;
		}
		tReturn = tReturn.trim() + sourString.trim();
		return tReturn;
	}

	/**
	 * 比较获取两天中较后的一天
	 * 
	 * @param date1
	 *            String
	 * @param date2
	 *            String
	 * @return String
	 */
	public static String getLaterDate(String date1, String date2) {
		try {
			date1 = StrTool.cTrim(date1);
			date2 = StrTool.cTrim(date2);
			if (date1.equals("")) {
				return date2;
			}
			if (date2.equals("")) {
				return date1;
			}
			FDate fd = new FDate();
			Date d1 = fd.getDate(date1);
			Date d2 = fd.getDate(date2);
			if (d1.after(d2)) {
				return date1;
			}
			return date2;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}

	}

	/**
	 * 通过起始日期和终止日期计算以时间间隔单位为计量标准的时间间隔 author: HST
	 * <p>
	 * <b>Example: </b>
	 * <p>
	 * <p>
	 * 参照calInterval(String cstartDate, String cendDate, String
	 * unit)，前两个变量改为日期型即可
	 * <p>
	 * 
	 * @param startDate
	 *            起始日期，Date变量
	 * @param endDate
	 *            终止日期，Date变量
	 * @param unit
	 *            时间间隔单位，可用值("Y"--年 "M"--月 "D"--日)
	 * @return 时间间隔,整形变量int
	 */
	public static int calInterval(Date startDate, Date endDate, String unit) {
		int interval = 0;

		GregorianCalendar sCalendar = new GregorianCalendar();
		sCalendar.setTime(startDate);
		int sYears = sCalendar.get(Calendar.YEAR);
		int sMonths = sCalendar.get(Calendar.MONTH);
		int sDays = sCalendar.get(Calendar.DAY_OF_MONTH);

		GregorianCalendar eCalendar = new GregorianCalendar();
		eCalendar.setTime(endDate);
		int eYears = eCalendar.get(Calendar.YEAR);
		int eMonths = eCalendar.get(Calendar.MONTH);
		int eDays = eCalendar.get(Calendar.DAY_OF_MONTH);

		if (unit.equals("Y")) {
			interval = eYears - sYears;
			if (eMonths < sMonths) {
				interval--;
			} else {
				if (eMonths == sMonths && eDays < sDays) {
					interval--;
					if (eMonths == 1) { // 如果同是2月，校验润年问题
						if ((sYears % 4) == 0 && (eYears % 4) != 0) { // 如果起始年是润年，终止年不是润年
							if (eDays == 28) { // 如果终止年不是润年，且2月的最后一天28日，那么补一
								interval++;
							}
						}
					}
				}
			}
		}
		if (unit.equals("M")) {
			interval = eYears - sYears;
			// interval = interval * 12;
			interval *= 12;

			// interval = eMonths - sMonths + interval;
			interval += eMonths - sMonths;
			if (eDays < sDays) {
				interval--;
				// eDays如果是月末，则认为是满一个月
				int maxDate = eCalendar.getActualMaximum(Calendar.DATE);
				if (eDays == maxDate) {
					interval++;
				}
			}
		}
		if (unit.equals("D")) {
			// ====del===liuxs===2006-09-09=====修改日期间隔计算漏洞================BGN=========
			// interval = eYears - sYears;
			// // interval = interval * 365;
			// interval *= 365;
			// // interval = eDaysOfYear - sDaysOfYear + interval;
			// interval += eDaysOfYear - sDaysOfYear;
			//
			// // 处理润年
			// int n = 0;
			// eYears--;
			// if (eYears > sYears)
			// {
			// int i = sYears % 4;
			// if (i == 0)
			// {
			// sYears++;
			// n++;
			// }
			// int j = (eYears) % 4;
			// if (j == 0)
			// {
			// eYears--;
			// n++;
			// }
			// n += (eYears - sYears) / 4;
			// }
			// if (eYears == sYears)
			// {
			// int i = sYears % 4;
			// if (i == 0)
			// {
			// n++;
			// }
			// }
			// interval += n;
			// ====del===liuxs===2006-09-09=====修改日期间隔计算漏洞================END=========
			// ====add===liuxs===2006-09-09=====修改日期间隔计算漏洞================BGN=========
			sCalendar.set(sYears, sMonths, sDays);
			eCalendar.set(eYears, eMonths, eDays);
			long lInterval = (eCalendar.getTime().getTime() - sCalendar.getTime().getTime()) / 86400000;
			interval = (int) lInterval;
			// ====add===liuxs===2006-09-09=====修改日期间隔计算漏洞================END=========
		}
		return interval;
	}

	/**
	 * 比较获取两天中较早的一天
	 * 
	 * @param date1
	 *            String
	 * @param date2
	 *            String
	 * @return String
	 */
	public static String getBeforeDate(String date1, String date2) {
		try {
			date1 = StrTool.cTrim(date1);
			date2 = StrTool.cTrim(date2);
			if (date1.equals("")) {
				return date2;
			}
			if (date2.equals("")) {
				return date1;
			}
			FDate fd = new FDate();
			Date d1 = fd.getDate(date1);
			Date d2 = fd.getDate(date2);
			if (d1.before(d2)) {
				return date1;
			}
			return date2;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}

	}

	/**
	 * 得到当前系统日期 author: YT
	 * 
	 * @return 当前日期的格式字符串,日期格式为"yyyy-MM-dd"
	 */
	public static String getCurrentDate() {
		String tString;
		String pattern = "yyyy-MM-dd";
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		Date today = new Date();
		tString = df.format(today);
		return tString;
	}

	/**
	 * 得到当前系统时间 author: YT
	 * 
	 * @return 当前时间的格式字符串，时间格式为"HH:mm:ss"
	 */
	public static String getCurrentTime() {
		String pattern = "HH:mm:ss";
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		Date today = new Date();
		String tString = df.format(today);
		return tString;
	}

	public static String getClassFileName(Object o) {
		String fileName = o.getClass().getName();
		fileName = fileName.substring(fileName.lastIndexOf(".") + 1);
		return fileName;
	}

	/**
	 * 转换JavaScript解析不了的特殊字符
	 * 
	 * @param s
	 *            String
	 * @return String
	 */
	public static String changForHTML(String s) {
		char[] arr = s.toCharArray();
		s = "";

		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == '"' || arr[i] == '\'') {
				s = s + "\\";
			}

			if (arr[i] == '\n') {
				s = s + "<br>";
				continue;
			}
			if (arr[i] == '\r')
				continue;

			s = s + arr[i];
		}

		return s;
	}
}
